#ifndef __MATH_H__
#define __MATH_H__
#include <stdint.h>
#include <math.h>
#include <stdlib.h>

/**
 * @desc  : 对指定数组生成CRC校验码
 * @date  : 2025-04-21
 * @author: AnRui
 * @param : buf - {参数说明}: 数组指针
 * @param : len - {参数说明}: 数组长度
 * @return: uint8_t
 * @note  :
 */
uint8_t MathCalcCrc8(uint8_t* buf, uint32_t len);

/**
 * @desc  : 对数组计算算术平均值
 * @date  : 2025-04-07
 * @author: AnRui
 * @param : arr - {参数说明}: 数组
 * @param : len - {参数说明}: 数组长度
 * @return: uint16_t
 * @note  :数组元素类型要求是uint16_t
 */
uint16_t MathCalcArithmeticMean(const uint16_t* arr, uint32_t len);

/**
 * @desc  : 对数组进行升序|降序排序
 * @date  : 2025-04-08
 * @author: AnRui
 * @param : arr - {参数说明}: 数组
 * @param : arrLen - {参数说明}: 数组长度
 * @param : direction - {参数说明}: 排序方向: 1:升序  -1:降序
 * @note  : 数组元素类型要求是uint16_t
 */
void SortArrayByDirection(uint16_t* arr, uint32_t arrLen, int direction);

/**
 * @desc  : 对数组进行去掉极值的中位数计算
 * @date  : 2025-04-08
 * @author: AnRui
 * @param : arr - {参数说明}: 数组指针
 * @param : len - {参数说明}: 数组长度
 * @return: uint16_t
 * @note  : 1.数组元素为uint16_t类型 2.数组元素必须>=3 3.数组元素类型要求是uint16_t
 */
uint16_t MathCalcTrimmedMean(uint16_t* arr, uint32_t len);

/**
 * @desc  : 在升序数组中基于二分法查找对应元素的下标
 * @date  : 2025-04-08
 * @author: AnRui
 * @param : arr - {参数说明}:  数组指针
 * @param : size - {参数说明}: 数组长度
 * @param : key - {参数说明}:  查找的值
 * @return: int32_t
 * @note  : 数组的数据类型为uint16_t
 */
int32_t MathCalcAsecBinarySearch(const uint16_t* arr, int32_t size, uint16_t key);



/**
 * @desc  : 在降序数组中基于二分法查找对应元素的下标
 * @date  : 2025-04-08
 * @author: AnRui
 * @param : arr - {参数说明}:  数组指针
 * @param : size - {参数说明}: 数组长度
 * @param : key - {参数说明}:  查找的值
 * @return: int32_t
 * @note  : 数组的数据类型为uint16_t
 */
int32_t MathCalcDescBinarySearch(const uint16_t* arr, int32_t size, uint16_t key);



/**
 * @desc  : 基于二分查找法 在升序数组中查找最接近目标值的元素
 * @date  : 2025-04-08
 * @author: AnRui
 * @param : arr - {参数说明}:
 * @param : size - {参数说明}:
 * @param : key - {参数说明}:
 * @return: int32_t
 * @note  : 1.数组元素必须是升序排列 2.查出来的元素是大于等于目标值的,即便有小于目标值的元素更接近,也不采用
 */
int32_t  MathCalcAscBinarySearchNear(const uint16_t* arr, int32_t size, uint16_t key);


/**
 * @desc  : 基于二分查找法 在降序数组中查找最接近目标值的元素 数组元素
 * @date  : 2025-04-08
 * @author: AnRui
 * @param : arr - {参数说明}:
 * @param : size - {参数说明}:
 * @param : key - {参数说明}:
 * @return: int32_t
 * @note  : 1.数组元素必须是降序排列 2.查出来的元素是小于等于目标值的,即便有大于目标值的元素更接近,也不采用
 */
int32_t MathCalcDescBinarySearchNear(const uint16_t* arr, int32_t size, uint16_t key);



#endif // __MATH_H__
